package com.zz.polymorphism;

public class Test {
    public static void main(String args[]){
        /**
         *   目标：认识多态，对象多态，行为多态
         *   好处1.可以实现解耦合，右边对象可以随时切换，后续业务随机改变
         */

        //1.对象多态
        People p1 = new Teacher();
        People p2 = new Student();

        //2.行为多态
        p1.run();//识别技巧：编译看左边，运行看右边
        p2.run();

        System.out.println(p2.name);//对于变量编译看左边，运行看左边

        Student s = new Student();
        go(s);

        Teacher t = new Teacher();
        go(t);

       // p2.test();多态情况下，不允许子类访问独有方法
        //解决：使用强制类型转换
        Student student = (Student)p2;
        student.test();

        /**
         * 强制类型转换存在的问题,编译阶段不会出错，运行时发现对象的真实类型与墙砖后的类型不同，
         * 就会报类型转换异常(ClassCastException)的错误出来
         */
//        Teacher teacher = (Teacher)p2;
        //解决
        if(p1 instanceof Student){
            Student s1 = (Student)p1;
            s1.test();
        }else{
            Teacher t1 = (Teacher)p1;
            t1.teach();
        }
    }
    //好处2.可以使用父类类型的变量作为形参，可以接收一切子类对象
    public static void go(People p){
        p.run();
    }
}
